home *** CD-ROM | disk | FTP | other *** search
/ Multimedia Toolkit / Multimedia Toolkit.iso / pascal / vtwins.pas < prev   
Pascal/Delphi Source File  |  1993-03-31  |  23KB  |  683 lines

  1. UNIT VTWins;
  2.  
  3. INTERFACE
  4.  
  5. USES VTGlobal, VTStrConst, StrConst,
  6.      SoundDevices, SongUnit, SongElements, PlayMod,
  7.      Output43, Vid43, Kbd;
  8.  
  9.  
  10. TYPE
  11.   TChWindows = ARRAY[1..4] OF TWindow;
  12.  
  13. CONST
  14.  
  15. {
  16.   EmptyPalet        = #$07;
  17.  
  18.   ScreenPalet       = #$07#$85;
  19.   RunInfoPalet      = #$47#$E0#$07#$F4;
  20.   MiscInfoPalet     = #$47#$E7;
  21.   CreditsPalet      = #$47#$C2;
  22.  
  23.   InfoNotePalet     = #$E7#$42;
  24.   PlayBarsPalet     = #$80#$A0#$C0;
  25.  
  26.   OscilloscPalet    = #$47#$58;
  27.   SamplesPalet      = #$07#$E0;
  28.   Samples1Palet     = #$07#$E7#$E0#$00#$70#$E1#$54#$53;
  29.   Samples2Palet     = #$07#$E7#$E0;
  30.   MenusPalet        = #$07#$00#$50#$17#$E1#$01#$10;
  31.  
  32.   PartPalet         = #$A0#$00#$07;
  33. }
  34.  
  35.   EmptyPalet        = #$01;
  36.  
  37.   ScreenPalet       = #$61#$62#$31;
  38.  
  39.   F8Palet           = #$10#$30#$10;
  40.  
  41.   RunInfoPalet      = #$51#$70#$01#$23;
  42.   MiscInfoPalet     = #$51#$70;
  43.   LabelPalet        = #$51#$37;
  44.  
  45.   ChannelNumPalet   = #$25;
  46.   RunSamplePalet    = #$01;
  47.   InfoNotePalet     = #$71#$25#$70;
  48.   PlayBarsPalet     = #$60#$40#$30;
  49.  
  50.   OscilloscPalet    = #$31#$2E;
  51.   SamplesPalet      = #$01#$70;
  52.   Samples1Palet     = #$01#$71#$70#$00#$20#$75#$23#$37;
  53.   Samples2Palet     = #$01#$71#$70;
  54.   MenusPalet        = #$01#$00#$20#$51#$75#$05#$50;
  55.  
  56.   PartPalet         = #$40#$00#$01#$25;
  57.  
  58.   CreditsPalet      = #$51#$21#$31;
  59.  
  60.  
  61.   wF8Demo      : TWindow = (x: 0; y: 0; w:80; h:27; col: F8Palet;        vis:FALSE; forz:FALSE; act:FALSE);
  62.   wF8DemoUp    : TWindow = (x: 0; y:-1; w:80; h: 2; col: ScreenPalet;    vis:FALSE; forz:FALSE; act:FALSE);
  63.   wF8DemoDown  : TWindow = (x: 0; y:26; w:80; h: 7; col: ScreenPalet;    vis:FALSE; forz:FALSE; act:FALSE);
  64.  
  65.   wScreen      : TWindow = (x: 0; y: 0; w:80; h:43; col: ScreenPalet;    vis:FALSE; forz:FALSE; act:FALSE);
  66.  
  67.   wTopLine     : TWindow = (x: 0; y: 0; w:80; h: 6; col: EmptyPalet;     vis:FALSE; forz:FALSE; act:FALSE);
  68.   wRunInfo     : TWindow = (x: 0; y: 0; w:20; h: 6; col: RunInfoPalet;   vis:FALSE; forz:FALSE; act:FALSE);
  69.   wMiscInfo    : TWindow = (x:19; y: 0; w:46; h: 6; col: MiscInfoPalet;  vis:FALSE; forz:FALSE; act:FALSE);
  70.   wLabel       : TWindow = (x:59; y: 0; w:21; h: 6; col: LabelPalet;     vis:FALSE; forz:FALSE; act:FALSE);
  71.  
  72.   w2ndLine     : TWindow = (x: 0; y: 5; w:80; h: 6; col: EmptyPalet;     vis:FALSE; forz:FALSE; act:FALSE);
  73.   wChannelNum  : TWindow = (x: 0; y: 5; w: 5; h: 6; col: ChannelNumPalet;vis:FALSE; forz:FALSE; act:FALSE);
  74.   wRunSample   : TWindow = (x: 3; y: 5; w:27; h: 6; col: RunSamplePalet; vis:FALSE; forz:FALSE; act:FALSE);
  75.   wInfoNote    : TWindow = (x:29; y: 5; w:30; h: 6; col: InfoNotePalet;  vis:FALSE; forz:FALSE; act:FALSE);
  76.   wPlayBars    : TWindow = (x:58; y: 5; w:18; h: 6; col: PlayBarsPalet;  vis:FALSE; forz:FALSE; act:FALSE);
  77.   wVoiceOnOff  : TWindow = (x:75; y: 5; w: 5; h: 6; col: EmptyPalet;     vis:FALSE; forz:FALSE; act:FALSE);
  78.  
  79.  
  80.   wOscillosc   : TWindow = (x: 0; y:10; w:53; h:18; col: OscilloscPalet; vis:FALSE; forz:FALSE; act:FALSE);
  81.   wSamples     : TWindow = (x: 0; y:10; w:53; h:18; col: SamplesPalet;   vis:FALSE; forz:FALSE; act:FALSE);
  82.   wSamples1    : TWindow = (x: 0; y:10; w:27; h:17; col: Samples1Palet;  vis:FALSE; forz:FALSE; act:FALSE);
  83.   wSamplesFill : TWindow = (x: 0; y:27; w:27; h: 1; col: Samples2Palet;  vis:FALSE; forz:FALSE; act:FALSE);
  84.   wSamples2    : TWindow = (x:26; y:10; w:27; h:18; col: Samples2Palet;  vis:FALSE; forz:FALSE; act:FALSE);
  85.  
  86.   wMenus       : TWindow = (x:52; y:10; w:28; h:18; col: MenusPalet;     vis:FALSE; forz:FALSE; act:FALSE);
  87.  
  88.   wPartSmall   : TWindow = (x: 0; y:27; w:80; h:16; col: EmptyPalet;     vis:FALSE; forz:FALSE; act:FALSE);
  89.   wPartPastIdx : TWindow = (x: 0; y:27; w: 4; h: 7; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE);
  90.   wPartPast    : TChWindows = (
  91.                            (x: 3; y:27; w:20; h: 7; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE),
  92.                            (x:22; y:27; w:20; h: 7; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE),
  93.                            (x:41; y:27; w:20; h: 7; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE),
  94.                            (x:60; y:27; w:20; h: 7; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE)
  95.                  );
  96.   wPartActIdx  : TWindow = (x: 0; y:33; w: 4; h: 4; col: EmptyPalet;     vis:FALSE; forz:FALSE; act:FALSE);
  97.   wPartAct     : TChWindows = (
  98.                            (x: 3; y:33; w:20; h: 4; col: EmptyPalet;     vis:FALSE; forz:FALSE; act:FALSE),
  99.                            (x:22; y:33; w:20; h: 4; col: EmptyPalet;     vis:FALSE; forz:FALSE; act:FALSE),
  100.                            (x:41; y:33; w:20; h: 4; col: EmptyPalet;     vis:FALSE; forz:FALSE; act:FALSE),
  101.                            (x:60; y:33; w:20; h: 4; col: EmptyPalet;     vis:FALSE; forz:FALSE; act:FALSE)
  102.                  );
  103.   wPartFutIdx  : TWindow = (x: 0; y:36; w: 4; h: 7; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE);
  104.   wPartFut     : TChWindows = (
  105.                            (x: 3; y:36; w:20; h: 7; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE),
  106.                            (x:22; y:36; w:20; h: 7; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE),
  107.                            (x:41; y:36; w:20; h: 7; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE),
  108.                            (x:60; y:36; w:20; h: 7; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE)
  109.                  );
  110.  
  111.   wPartBig     : TWindow = (x: 0; y: 5; w:80; h:38; col: EmptyPalet;     vis:FALSE; forz:FALSE; act:FALSE);
  112.   wPartPastBIdx: TWindow = (x: 0; y: 5; w: 4; h:18; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE);
  113.   wPartPastBig : TChWindows = (
  114.                            (x: 3; y: 5; w:20; h:18; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE),
  115.                            (x:22; y: 5; w:20; h:18; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE),
  116.                            (x:41; y: 5; w:20; h:18; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE),
  117.                            (x:60; y: 5; w:20; h:18; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE)
  118.                  );
  119.   wPartActBIdx : TWindow = (x: 0; y:22; w: 4; h: 4; col: EmptyPalet;     vis:FALSE; forz:FALSE; act:FALSE);
  120.   wPartActBig  : TChWindows = (
  121.                            (x: 3; y:22; w:20; h: 4; col: EmptyPalet;     vis:FALSE; forz:FALSE; act:FALSE),
  122.                            (x:22; y:22; w:20; h: 4; col: EmptyPalet;     vis:FALSE; forz:FALSE; act:FALSE),
  123.                            (x:41; y:22; w:20; h: 4; col: EmptyPalet;     vis:FALSE; forz:FALSE; act:FALSE),
  124.                            (x:60; y:22; w:20; h: 4; col: EmptyPalet;     vis:FALSE; forz:FALSE; act:FALSE)
  125.                  );
  126.   wPartFutBIdx : TWindow = (x: 0; y:25; w: 4; h:18; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE);
  127.   wPartFutBig  : TChWindows = (
  128.                            (x: 3; y:25; w:20; h:18; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE),
  129.                            (x:22; y:25; w:20; h:18; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE),
  130.                            (x:41; y:25; w:20; h:18; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE),
  131.                            (x:60; y:25; w:20; h:18; col: PartPalet;      vis:FALSE; forz:FALSE; act:FALSE)
  132.                  );
  133.   wCredits     : TWindow = (x: 0; y: 5; w:80; h:38; col: CreditsPalet;   vis:FALSE; forz:FALSE; act:FALSE);
  134.  
  135. CONST
  136.   BarVal : CHAR = '▒';
  137.  
  138.   FirstChannel : BYTE = 1;
  139.  
  140. VAR
  141.   wriX1, wriX2,
  142.   wmiX1, wmiX2, wmiX3,
  143.   winX1, winX2, winX3, winX4, winX5,
  144.   wsX1                               : WORD;
  145.  
  146.  
  147.  
  148. PROCEDURE InitWinF8Demo;
  149. PROCEDURE InitWinScreen;
  150. PROCEDURE InitWinTopLine;
  151. PROCEDURE InitWin2ndLine;
  152. PROCEDURE InitWinOscillosc;
  153. PROCEDURE InitWinSamples;
  154. PROCEDURE InitWinMenus;
  155. PROCEDURE InitWinPart;
  156. PROCEDURE InitWinBigPart;
  157. PROCEDURE InitWinCredits;
  158.  
  159. PROCEDURE InitScreen;
  160.  
  161. PROCEDURE RefreshMiscInfo   (VAR Song: TSong);
  162. PROCEDURE RefreshModuleInfo (VAR Song: TSong);
  163.  
  164.  
  165.  
  166.  
  167. IMPLEMENTATION
  168.  
  169. USES Heaps;
  170.  
  171.  
  172.  
  173.  
  174. PROCEDURE InitWinF8Demo;
  175.   VAR
  176.     i       : WORD;
  177.     SaveOfs : WORD;
  178.     Spaces  : STRING[80];
  179.   BEGIN
  180.     SaveOfs   := ScrOffset;
  181.     ScrOffset := 0;
  182.  
  183.     ClearScreen;
  184.     PutWindowBigFrame(wF8Demo);
  185.  
  186.     WITH wF8Demo DO
  187.       BEGIN
  188.  
  189.         FillChar(Spaces, SIZEOF(Spaces), ' ');
  190.         Spaces[0] := #80;
  191.  
  192.         FOR i := 0 TO 26 DO
  193.           DirectWriteAttr(ParseCoords(0, i), Spaces, BYTE(Col[3]));
  194.  
  195.         PutWindowBigFrame(wF8DemoUp);
  196.         PutWindowBigFrame(wF8DemoDown);
  197.  
  198.         DirectWriteAttr(ParseCoords(27, 4), 'Demo de ventanas  en el VT', BYTE(Col[3]));
  199.         DirectWriteAttr(ParseCoords(35, 6), '¿Te gusta?',                 BYTE(Col[3]));
  200.  
  201.         DirectWriteAttr(ParseCoords(7, 10),
  202.           'En la próxima versión se supone que aquí podrás hacer el Shell.',                 BYTE(Col[2]));
  203.       END;
  204.  
  205.     ScrOffset := SaveOfs;
  206.   END;
  207.  
  208.  
  209. PROCEDURE InitWinScreen;
  210.   BEGIN
  211.     ClearScreen;
  212.     PutWindowBigFrame(wScreen);
  213.   END;
  214.  
  215.  
  216. PROCEDURE InitWinRunInfo;
  217.   BEGIN
  218.     PutWindow(wRunInfo);
  219.  
  220.     WITH wRunInfo DO BEGIN
  221.       vis  := FALSE;
  222.       forz := FALSE;
  223.       act  := FALSE;
  224.  
  225.       wriX1 := 12;
  226.       wriX2 := 16;
  227.       DirectWrite     (ParseCoords(x+ 1, y+1), GetString(StrPosition));
  228.       DirectWrite     (ParseCoords(x+ 1, y+2), GetString(StrPattern));
  229.       DirectWrite     (ParseCoords(x+ 1, y+3), GetString(StrNote));
  230.       DirectWrite     (ParseCoords(x+ 1, y+4), GetString(StrTempo));
  231.       DirectWriteAttr (ParseCoords(x+wriX2-1, y+1), '/',   BYTE(col[3]));
  232.       DirectWriteAttr (ParseCoords(x+wriX2-1, y+2), '/',   BYTE(col[3]));
  233.       DirectWriteAttr (ParseCoords(x+wriX2-1, y+3), '/',   BYTE(col[3]));
  234.       RectAttr        (ParseCoords(x+wriX2,   y+1), 3, 3,  BYTE(col[2]));
  235.       RectAttr        (ParseCoords(x+wriX1,   y+1), 3, 4,  BYTE(col[2]));
  236.       DirectWriteAttr (ParseCoords(x+wriX2,   y+4), 'F',   BYTE(col[3]));
  237.       DirectWriteAttr (ParseCoords(x+wriX2+1, y+4), '  ',  BYTE(col[2]));
  238.     END;
  239.   END;
  240.  
  241.  
  242. PROCEDURE InitWinMiscInfo;
  243.   BEGIN
  244.     PutWindow(wMiscInfo);
  245.  
  246.     WITH wMiscInfo DO BEGIN
  247.       DirectWrite (ParseCoords(x+1,  y+1), GetString(StrModule));
  248.       DirectWrite (ParseCoords(x+1,  y+2), GetString(StrFilename));
  249.       DirectWrite (ParseCoords(x+1,  y+3), GetString(StrMemoryLeft));
  250.       DirectWrite (ParseCoords(x+1,  y+4), GetString(StrSampleRate));
  251.       DirectWrite (ParseCoords(x+18, y+4), GetString(StrVolume));
  252.       wmiX1 := 12;
  253.       wmiX2 := 25;
  254.       wmiX3 := 26;
  255.       DirectWrite (ParseCoords(x+wmiX2-1, y+2), '/');
  256.       RectAttr    (ParseCoords(x+wmiX1, y+1), 20,         1, BYTE(col[2]));
  257.       RectAttr    (ParseCoords(x+wmiX1, y+2), 12,         1, BYTE(col[2]));
  258.       RectAttr    (ParseCoords(x+wmiX2, y+2), 12,         1, BYTE(col[2]));
  259.       RectAttr    (ParseCoords(x+wmiX1, y+3), 21,         1, BYTE(col[2]));
  260.       RectAttr    (ParseCoords(x+wmiX1, y+4), 5,          1, BYTE(col[2]));
  261.       RectAttr    (ParseCoords(x+wmiX3, y+4), 3,          1, BYTE(col[2]));
  262.     END;
  263.   END;
  264.  
  265.  
  266. PROCEDURE InitWinLabel;
  267.   BEGIN
  268.     PutWindow(wLabel);
  269.  
  270.     WITH wLabel DO BEGIN
  271.       RectAttr    (ParseCoords(x+2, y+2), 17, 2, BYTE(col[2]));
  272.       DirectWrite (ParseCoords(x+3, y+2), 'Vangeli⌐¬racker');
  273.       DirectWrite (ParseCoords(x+4, y+3), NoBetaPadding+Version+BetaPadStr);
  274.     END;
  275.   END;
  276.  
  277.  
  278. PROCEDURE InitWinTopLine;
  279.   BEGIN
  280.     InitWinRunInfo;
  281.     InitWinMiscInfo;
  282.     InitWinLabel;
  283.   END;
  284.  
  285.  
  286. PROCEDURE InitWinChannelNum;
  287.   CONST
  288.     s : STRING[2] = '  ';
  289.   VAR
  290.     i : WORD;
  291.   BEGIN
  292.     PutWindow(wChannelNum);
  293.  
  294.     WITH wChannelNum DO
  295.       FOR i := 1 TO 4 DO
  296.         BEGIN
  297.           s[2] := CHAR(i + ORD('0'));
  298.           DirectWrite(ParseCoords(x+1, y+i), s);
  299.         END;
  300.   END;
  301.  
  302.  
  303. PROCEDURE InitWinRunSample;
  304.   BEGIN
  305.     PutWindow(wRunSample);
  306.   END;
  307.  
  308.  
  309. PROCEDURE InitWinInfoNote;
  310.   BEGIN
  311.     PutWindow(wInfoNote);
  312.  
  313.     WITH wInfoNote DO BEGIN
  314.       winX1 :=  2;
  315.       winX2 :=  6;
  316.       winX3 :=  9;
  317.       winX4 := 16;
  318.       winX5 := 23;
  319.       PutRotulo (ParseCoords(x+ 1, y), 'freq', BYTE(col[2]));
  320.       PutRotulo (ParseCoords(x+ 6, y), 'vl',   BYTE(col[2]));
  321.       PutRotulo (ParseCoords(x+11, y), 'reps', BYTE(col[2]));
  322.       PutRotulo (ParseCoords(x+18, y), 'repl', BYTE(col[2]));
  323.       PutRotulo (ParseCoords(x+26, y), 'len',  BYTE(col[2]));
  324.       RectAttr  (ParseCoords(x+ 2, y+1), 3, 4, BYTE(col[3]));
  325.       RectAttr  (ParseCoords(x+ 6, y+1), 2, 4, BYTE(col[3]));
  326.       RectAttr  (ParseCoords(x+ 9, y+1), 6, 4, BYTE(col[3]));
  327.       RectAttr  (ParseCoords(x+16, y+1), 6, 4, BYTE(col[3]));
  328.       RectAttr  (ParseCoords(x+23, y+1), 6, 4, BYTE(col[3]));
  329.     END;
  330.   END;
  331.  
  332.  
  333. PROCEDURE InitWinPlayBars;
  334.   VAR
  335.     i, j : WORD;
  336.   BEGIN
  337.     PutWindow(wPlayBars);
  338.  
  339.     WITH wPlayBars DO BEGIN
  340.       vis  := FALSE;
  341.       forz := FALSE;
  342.       act  := FALSE;
  343.  
  344.       FOR i := 1 TO 4 DO
  345.         FOR j := 1 TO 16 DO
  346.           DirectWriteAttr(ParseCoords(x+j, y+i), Barval, BYTE(col[1]));
  347.     END;
  348.   END;
  349.  
  350.  
  351. PROCEDURE InitWinVoiceOnOff;
  352.   BEGIN
  353.     PutWindow(wVoiceOnOff);
  354.   END;
  355.  
  356.  
  357. PROCEDURE InitWin2ndLine;
  358.   BEGIN
  359.     InitWinChannelNum;
  360.     InitWinRunSample;
  361.     InitWinInfoNote;
  362.     InitWinPlayBars;
  363.     InitWinVoiceOnOff;
  364.   END;
  365.  
  366. {
  367.  
  368. PROCEDURE InitOscilloscInfo;
  369.   CONST
  370.     EmptyStr : STRING[51] = '                                                   ';
  371.     OscView  : STRING[30] = '';
  372.     i        : WORD       = 0;
  373.     j        : WORD       = 0;
  374.     ofs      : WORD       = 0;
  375.   VAR
  376.     OscWinBuff    : ARRAY[1..16, 1..51*2] OF CHAR;
  377.   BEGIN
  378.     OscView := GetString(StrOscilloscView);
  379.     WITH wOscillosc DO BEGIN
  380.       FOR i := 1 TO 16 DO PutStr(OscWinBuff[i], EmptyStr, BYTE(col[1]));
  381.       PutStr(OscWinBuff[1][21*2-1], OscView, BYTE(col[1]));
  382.       FOR i := 3 TO 14 DO BEGIN
  383.         OscWinBuff[i][4] := col[1];
  384.         OscWinBuff[i][6] := col[1];
  385.         OscWinBuff[i][8] := col[1];
  386.         OscWinBuff[i][3] := ' ';
  387.         OscWinBuff[i][5] := ' ';
  388.         OscWinBuff[i][7] := #131;
  389.         FOR j := 5 TO 50 DO BEGIN
  390.           OscWinBuff[i][j*2]   := col[2];
  391.           OscWinBuff[i][j*2-1] := #0;
  392.         END;
  393.       END;
  394.       OscWinBuff[15][8] := col[1];
  395.       OscWinBuff[15][7] := #150;
  396.       FOR j := 5 TO 50 DO BEGIN
  397.         OscWinBuff[15][j*2]   := col[1];
  398.         OscWinBuff[15][j*2-1] := #148;
  399.       END;
  400.  
  401.       Ofs := ParseCoords(x+1, y+1);
  402.       FOR i := 1 TO 16 DO BEGIN
  403.         Move(OscWinBuff[i], Ptr(ScrSegment, Ofs)^, SIZEOF(OscWinBuff[1]));
  404.         INC(Ofs, ScreenBytesX);
  405.       END;
  406.     END;
  407.   END;
  408.  
  409. }
  410.  
  411. PROCEDURE InitWinOscillosc;
  412.   VAR
  413.     i : WORD;
  414.   BEGIN
  415.     PutWindow(wOscillosc);
  416.  
  417.     WITH wOscillosc DO BEGIN
  418.       DirectWrite(ParseCoords(x+21, y+1), GetString(StrOscilloscView));
  419.       FOR i := 3 TO 14 DO
  420.         DirectWrite(ParseCoords(x+4, y+i),  #131);
  421.       DirectWrite  (ParseCoords(x+4, y+15), #150);
  422.       FOR i := 5 TO 50 DO
  423.         DirectWrite(ParseCoords(x+i, y+15), #148);
  424.     END;
  425.   END;
  426.  
  427.  
  428. PROCEDURE InitWinSamples;
  429.   VAR
  430.     i : WORD;
  431.   BEGIN
  432.     PutWindow(wSamples);
  433.     PutWindow(wSamples1);
  434.     FOR i := 1 TO 4 DO
  435.       WITH wPartPast[i] DO BEGIN
  436.         PutRotulo(ParseCoords(x+5,                               y), GetString(StrChannel), BYTE(col[4]));
  437.         PutRotulo(ParseCoords(x+5+Length(GetString(StrChannel)), y), CHAR(i+ORD('0')),      BYTE(col[4]));
  438.       END;
  439.   END;
  440.  
  441.  
  442. PROCEDURE InitWinMenus;
  443.   BEGIN
  444.     PutWindow(wMenus);
  445.  
  446.     wsX1 := 4;
  447.  
  448.     WITH wMenus DO BEGIN
  449.       RectAttr    (ParseCoords(x+2, y+2), 24, 3,  $00);
  450.       DirectWrite (ParseCoords(x+2, y+1), '▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄');
  451.       DirectWrite (ParseCoords(x+2, y+3), '▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄');
  452.       DirectWrite (ParseCoords(x+2, y+5), '▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀');
  453.     END;
  454.  
  455.  
  456.     WITH wMenus DO BEGIN
  457.       DirectWriteAttr(ParseCoords(x+ 2, y+2), ' FILE  EDIT  PLAY  MISC ', BYTE(col[3]));
  458.       RectAttr       (ParseCoords(x+14, y+1), 6,  1, BYTE(col[4]));
  459.       RectAttr       (ParseCoords(x+14, y+2), 6,  1, BYTE(col[5]));
  460.       RectAttr       (ParseCoords(x+14, y+3), 6,  1, BYTE(col[6]));
  461.  
  462.       DirectWriteAttr(ParseCoords(x+ 2, y+4), ' SAMPLES  PATTERN  SONG ', BYTE(col[3]));
  463.       RectAttrMask   (ParseCoords(x+20, y+3), 6,  1, BYTE(col[7]), $0F);
  464.       RectAttr       (ParseCoords(x+20, y+4), 6,  1, BYTE(col[5]));
  465.       RectAttr       (ParseCoords(x+20, y+5), 6,  1, BYTE(col[4]));
  466.  
  467. {
  468.       DirectWriteAttr(x+2, y+4, '   MODULE      SAMPLE   ', BYTE(col[3]));
  469.       RectAttrMask   (x+2, y+3, 12,  1, $01, $F0);
  470.       RectAttr       (x+2, y+4, 12,  1, $1E);
  471.       RectAttr       (x+2, y+5, 12,  1, $71);
  472.  
  473.       DirectWriteAttr(x+2, y+4, ' SAMPLES  PATTERN  LINK ', BYTE(col[3]));
  474.       DirectWriteAttr(x+2, y+4, ' SAMPLES  PATTERN  SONG ', BYTE(col[3]));
  475.       DirectWriteAttr(x+2, y+4, ' NAME ',                   BYTE(col[3]));
  476. }
  477.  
  478.       DirectWrite(ParseCoords(x+3, y+ 6), GetString(StrMenu1));
  479.       DirectWrite(ParseCoords(x+3, y+ 7), GetString(StrMenu2));
  480.       DirectWrite(ParseCoords(x+3, y+ 8), GetString(StrMenu3));
  481.       DirectWrite(ParseCoords(x+3, y+ 9), GetString(StrMenu4));
  482.       DirectWrite(ParseCoords(x+3, y+10), GetString(StrMenu5));
  483.       DirectWrite(ParseCoords(x+3, y+11), GetString(StrMenu6));
  484.       DirectWrite(ParseCoords(x+3, y+12), GetString(StrMenu7));
  485.       DirectWrite(ParseCoords(x+3, y+13), GetString(StrMenu8));
  486.       DirectWrite(ParseCoords(x+3, y+14), GetString(StrMenu9));
  487.       DirectWrite(ParseCoords(x+3, y+15), GetString(StrMenu0));
  488.     END;
  489.   END;
  490.  
  491.  
  492. PROCEDURE InitWinPart;
  493.   VAR
  494.     i : WORD;
  495.   BEGIN
  496.     PutWindow(wPartSmall);
  497.     PutWindow(wPartPastIdx);
  498.     PutWindow(wPartActIdx);
  499.     PutWindow(wPartFutIdx);
  500.     FOR i := 1 TO 4 DO BEGIN
  501.       PutWindow(wPartPast[i]);
  502.       PutWindow(wPartAct[i]);
  503.       PutWindow(wPartFut[i]);
  504.       WITH wPartPast[i] DO BEGIN
  505.         PutRotulo(ParseCoords(x+5,                               y), GetString(StrChannel), BYTE(col[4]));
  506.         PutRotulo(ParseCoords(x+5+Length(GetString(StrChannel)), y), CHAR(i+ORD('0')),      BYTE(col[4]));
  507.       END;
  508.     END;
  509.   END;
  510.  
  511.  
  512. PROCEDURE InitWinBigPart;
  513.   VAR
  514.     i : WORD;
  515.   BEGIN
  516.     PutWindow(wPartBig);
  517.     PutWindow(wPartPastBIdx);
  518.     PutWindow(wPartActBIdx);
  519.     PutWindow(wPartFutBIdx);
  520.     FOR i := 1 TO 4 DO BEGIN
  521.       PutWindow(wPartPastBig[i]);
  522.       PutWindow(wPartActBig[i]);
  523.       PutWindow(wPartFutBig[i]);
  524.       WITH wPartPastBig[i] DO BEGIN
  525.         PutRotulo(ParseCoords(x+5,                               y), GetString(StrChannel), BYTE(col[4]));
  526.         PutRotulo(ParseCoords(x+5+Length(GetString(StrChannel)), y), CHAR(i+ORD('0')),      BYTE(col[4]));
  527.       END;
  528.     END;
  529.   END;
  530.  
  531.  
  532. PROCEDURE InitWinCredits;
  533.   VAR
  534.     i : WORD;
  535.   BEGIN
  536.     PutWindow(wCredits);
  537.  
  538.     WITH wCredits DO BEGIN
  539.       DirectWriteAttr(ParseCoords  (x+10, y+   2), GetString(StrCreditsTitle), BYTE(col[3]));
  540.  
  541.       i := 0;
  542.       WHILE GetString(StrCredits + i) <> #0 DO
  543.         BEGIN
  544.           DirectWriteAttr(ParseCoords(x+10, y+i+ 4), GetString(StrCredits + i), BYTE(col[1]));
  545.           INC(i);
  546.         END;
  547.  
  548.       i := 0;
  549.       WHILE GetString(StrDedicat + i) <> #0 DO
  550.         BEGIN
  551.           DirectWriteAttr(ParseCoords(x+10, y+i+34), GetString(StrDedicat + i), BYTE(col[2]));
  552.           INC(i);
  553.         END;
  554.     END;
  555.  
  556.   END;
  557.  
  558.  
  559.  
  560.  
  561. PROCEDURE InitScreen;
  562.   VAR
  563.     i, j : WORD;
  564.     s    : STRING;
  565.   BEGIN
  566.  
  567.     InitWinScreen;
  568.     InitWinTopLine;
  569.     InitWin2ndLine;
  570.     InitWinSamples;
  571.     InitWinMenus;
  572.     InitWinPart;
  573.  
  574.   END;
  575.  
  576.  
  577.  
  578. PROCEDURE RefreshMiscInfo(VAR Song: TSong);
  579.   VAR
  580.     s : STRING;
  581.     t : STRING;
  582.     u : STRING;
  583.   BEGIN
  584.     WITH wMiscInfo DO BEGIN
  585.       DirectWriteAttr(ParseCoords(x+wmiX1, y+1), Song.GetName,               BYTE(col[2]));
  586.       DirectWriteAttr(ParseCoords(x+wmiX1, y+2), Song.FileName+Song.FileExt, BYTE(col[2]));
  587.       DirectWriteAttr(ParseCoords(x+wmiX2, y+2), Song.GetInsidePath,         BYTE(col[2]));
  588.       STR(Heap.HMaxAvail,    s);
  589.       STR(Heap.HMemAvail,    t);
  590.       STR(UmbHeap.HMemAvail, u);
  591.                                                  {xxxxx (xxxxx) | xxxxxx}
  592.       DirectWriteAttr(ParseCoords(x+wmiX1, y+3), '                      ', BYTE(col[2]));
  593.       DirectWriteAttr(ParseCoords(x+wmiX1, y+3), t+' ('+s+') | '+u,        BYTE(col[2]));
  594.  
  595.       IF SoundHz >= 500 THEN
  596.         STR(SoundHz + 50 - ((SoundHz + 50) MOD 100), s)
  597.       ELSE
  598.         s := 'FallB';
  599.       DirectWriteAttr(ParseCoords(x+wmiX1, y+4), '     ',                  BYTE(col[2]));
  600.       DirectWriteAttr(ParseCoords(x+wmiX1, y+4), s,                        BYTE(col[2]));
  601.  
  602.       STR(UserVols[1] : 3, s);
  603.       DirectWriteAttr(ParseCoords(x+wmiX3, y+4), s,                        BYTE(col[2]));
  604.     END;
  605.   END;
  606.  
  607.  
  608.  
  609.  
  610. PROCEDURE InitSampleWin(VAR Song: TSong);
  611.   CONST
  612.     s     : STRING      = '';
  613.     i     : WORD        = 0;
  614.     Instr : PInstrument = NIL;
  615.   BEGIN
  616.     WITH wSamples1 DO
  617.       FOR i := 1 TO 15 DO BEGIN
  618.         STR(i : 2, s);
  619.         DirectWriteAttr   (ParseCoords(x+1,    y+i), s,                      BYTE(col[3]));
  620.         Instr := Song.GetInstrument(i);
  621.         IF Instr = NIL THEN
  622.           DirectWriteAttr (ParseCoords(x+wsX1, y+i), '                    ', BYTE(col[2]))
  623.         ELSE IF Instr^.Instr = NIL THEN
  624.           DirectWriteAttr (ParseCoords(x+wsX1, y+i), Instr^.GetName,         BYTE(col[2]))
  625.         ELSE
  626.           DirectWriteAttr (ParseCoords(x+wsX1, y+i), Instr^.GetName,         BYTE(col[3]));
  627.       END;
  628.  
  629.     WITH wSamples2 DO
  630.       FOR i := 16 TO 31 DO BEGIN
  631.         STR(i : 2, s);
  632.         DirectWriteAttr   (ParseCoords(x+1,    y+i-15), s,                      BYTE(col[3]));
  633.         Instr := Song.GetInstrument(i);
  634.         IF Instr = NIL THEN
  635.           DirectWriteAttr (ParseCoords(x+wsX1, y+i-15), '                    ', BYTE(col[2]))
  636.         ELSE IF Instr^.Instr = NIL THEN
  637.           DirectWriteAttr (ParseCoords(x+wsX1, y+i-15), Instr^.GetName,         BYTE(col[1]))
  638.         ELSE
  639.           DirectWriteAttr (ParseCoords(x+wsX1, y+i-15), Instr^.GetName,         BYTE(col[3]));
  640.       END;
  641.   END;
  642.  
  643.  
  644.  
  645.  
  646. PROCEDURE RefreshModuleInfo(VAR Song: TSong);
  647.   VAR
  648.     s : STRING;
  649.     i : WORD;
  650.   BEGIN
  651.  
  652.     WITH wRunInfo DO BEGIN
  653.       STR(Song.SequenceLength   : 3, s); DirectWrite(ParseCoords(x+wriX2, y+1), s);
  654.       STR(Song.Patterns.Count   : 3, s); DirectWrite(ParseCoords(x+wriX2, y+2), s);
  655.       s := '   ';
  656.       DirectWrite(ParseCoords(x+wriX1, y+1), s);
  657.       DirectWrite(ParseCoords(x+wriX1, y+2), s);
  658.       DirectWrite(ParseCoords(x+wriX1, y+3), s);
  659.       DirectWrite(ParseCoords(x+wriX1, y+4), s);
  660.     END;
  661.  
  662.     RefreshMiscInfo(Song);
  663.  
  664.     InitSampleWin(Song);
  665.   END;
  666.  
  667.  
  668.  
  669.  
  670.  
  671.  
  672.  
  673. {
  674. VAR
  675.   BIOSScrOffset : WORD ABSOLUTE 0:$44E;
  676. }
  677. BEGIN
  678.  
  679.   pwAttr    := BYTE(wScreen.col[2]);
  680. {  ScrOffset := BIOSScrOffset;}
  681.  
  682. END.
  683.